package com.bml.architect.algorithms.standard;

import com.google.common.collect.Range;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;

import java.util.Arrays;
import java.util.Collection;

public class MyRangeTableAlgorithm implements RangeShardingAlgorithm<Long> {
    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Long> rangeShardingValue) {
        //逻辑表
        String logicTableName = rangeShardingValue.getLogicTableName();
        //分片健
        String columnName = rangeShardingValue.getColumnName();
        //range 范围 值，select * from course where userid between 1 and 100
        Range<Long> valueRange = rangeShardingValue.getValueRange();
        //在实际的工作中，如果使用到了分库分表，那么上限值和下限值大概率都是需要的参与到计算策略中的
        Long lowerEndpoint = valueRange.lowerEndpoint();//1
        Long aLong = valueRange.upperEndpoint();//100
        //这里可以根据 range的值来自定义到底要返回那些数据库列表，比如有3个库，我们使用sharding jdbc的时候一定要有明确的数据分布，
        //不然的话就需要到所有的的库的检索了，这个sharding jdbc给你做不了的，需要你自己去设计数据的分布路线，这里我就简单的返回
        //我的两个表，实际生产使用中肯定要充分考虑到分库分表的每个关键字段的数据应该怎么样来分布

        //这里直接返回course_1和course_2

        return Arrays.asList(logicTableName+"_1",logicTableName+"_2");
    }
}
